import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar
import org.springframework.build.shadow.ShadowSource

plugins {
	id 'me.champeau.mrjar'
}

description = "Spring Core"

apply plugin: "kotlin"
apply plugin: "kotlinx-serialization"

multiRelease {
	targetVersions 17, 21
}

def javapoetVersion = "1.13.0"
def objenesisVersion = "3.3"

configurations {
	java21Api.extendsFrom(api)
	java21Implementation.extendsFrom(implementation)
	javapoet
	objenesis
	graalvm
}

task javapoetRepackJar(type: ShadowJar) {
	archiveBaseName = 'spring-javapoet-repack'
	archiveVersion = javapoetVersion
	configurations = [project.configurations.javapoet]
	relocate('com.squareup.javapoet', 'org.springframework.javapoet')
}

task javapoetSource(type: ShadowSource) {
	configurations = [project.configurations.javapoet]
	relocate('com.squareup.javapoet', 'org.springframework.javapoet')
	outputDirectory = file("build/shadow-source/javapoet")
}

task javapoetSourceJar(type: Jar) {
	archiveBaseName = 'spring-javapoet-repack'
	archiveVersion = javapoetVersion
	archiveClassifier = 'sources'
	from javapoetSource
}

task objenesisRepackJar(type: ShadowJar) {
	archiveBaseName = 'spring-objenesis-repack'
	archiveVersion = objenesisVersion
	configurations = [project.configurations.objenesis]
	relocate('org.objenesis', 'org.springframework.objenesis')
}

task objenesisSource(type: ShadowSource) {
	configurations = [project.configurations.objenesis]
	relocate('org.objenesis', 'org.springframework.objenesis')
	outputDirectory = file("build/shadow-source/objenesis")
}

task objenesisSourceJar(type: Jar) {
	archiveBaseName = 'spring-objenesis-repack'
	archiveVersion = objenesisVersion
	archiveClassifier = 'sources'
	from objenesisSource
}

dependencies {
	javapoet("com.squareup:javapoet:${javapoetVersion}@jar")
	objenesis("org.objenesis:objenesis:${objenesisVersion}@jar")
	api(files(javapoetRepackJar))
	api(files(objenesisRepackJar))
	api(project(":spring-jcl"))
	compileOnly("io.projectreactor.tools:blockhound")
	compileOnly("org.graalvm.sdk:graal-sdk")
	optional("io.micrometer:context-propagation")
	optional("io.netty:netty-buffer")
	optional("io.netty:netty5-buffer")
	optional("io.projectreactor:reactor-core")
	optional("io.reactivex.rxjava3:rxjava")
	optional("io.smallrye.reactive:mutiny")
	optional("net.sf.jopt-simple:jopt-simple")
	optional("org.aspectj:aspectjweaver")
	optional("org.jetbrains.kotlin:kotlin-reflect")
	optional("org.jetbrains.kotlin:kotlin-stdlib")
	optional("org.jetbrains.kotlinx:kotlinx-coroutines-core")
	optional("org.jetbrains.kotlinx:kotlinx-coroutines-reactor")
	testFixturesImplementation("com.google.code.findbugs:jsr305")
	testFixturesImplementation("io.projectreactor:reactor-test")
	testFixturesImplementation("org.assertj:assertj-core")
	testFixturesImplementation("org.junit.platform:junit-platform-launcher")
	testFixturesImplementation("org.junit.jupiter:junit-jupiter-api")
	testFixturesImplementation("org.junit.jupiter:junit-jupiter-params")
	testFixturesImplementation("org.xmlunit:xmlunit-assertj")
	testImplementation("com.fasterxml.jackson.core:jackson-databind")
	testImplementation("com.fasterxml.woodstox:woodstox-core")
	testImplementation("com.google.code.findbugs:jsr305")
	testImplementation("com.squareup.okhttp3:mockwebserver")
	testImplementation("io.projectreactor:reactor-test")
	testImplementation("io.projectreactor.tools:blockhound")
	testImplementation("jakarta.annotation:jakarta.annotation-api")
	testImplementation("jakarta.xml.bind:jakarta.xml.bind-api")
	testImplementation("org.jetbrains.kotlinx:kotlinx-serialization-json")
	testImplementation("org.jetbrains.kotlinx:kotlinx-coroutines-reactor")
	testImplementation("org.mockito:mockito-core")
	testImplementation("org.skyscreamer:jsonassert")
	testImplementation("org.xmlunit:xmlunit-assertj")
	testImplementation("org.xmlunit:xmlunit-matchers")
}

jar {
	manifest.attributes["Dependencies"] = "jdk.unsupported,org.jboss.vfs" // for WildFly (Objenesis and VfsUtils)

	dependsOn javapoetRepackJar
	from(zipTree(javapoetRepackJar.archiveFile)) {
		include "org/springframework/javapoet/**"
	}

	dependsOn objenesisRepackJar
	from(zipTree(objenesisRepackJar.archiveFile)) {
		include "org/springframework/objenesis/**"
	}
}

test {
	// Make sure the classes dir is used on the test classpath (required by ResourceTests).
	// When test fixtures are involved, the JAR is used by default.
	classpath = sourceSets.main.output.classesDirs + files(sourceSets.main.output.resourcesDir) + classpath - files(jar.archiveFile)

	// Ensure that BlockHound tests run on JDK 13+. For details, see:
	// https://github.com/reactor/BlockHound/issues/33
	jvmArgs += [
		"-XX:+AllowRedefinitionToAddDeleteMethods"
	]
}

sourcesJar {
	dependsOn javapoetSourceJar
	dependsOn objenesisSourceJar
	from javapoetSource
	from objenesisSource
}

eclipse {
	synchronizationTasks javapoetSourceJar, objenesisSourceJar
	classpath {
		file {
			whenMerged {
				def pattern = ~/\/spring-\w+-repack-/
				entries.forEach {
					if (pattern.matcher(it.path).find()) {
						def sourcesJar = it.path.replace('.jar', '-sources.jar')
						it.sourcePath = fileReference(file(sourcesJar))
					}
				}
			}
		}
	}
}

tasks['eclipse'].dependsOn(javapoetRepackJar, javapoetSourceJar, objenesisRepackJar, objenesisSourceJar)
